<!--
 * @Author: lmh
 * @Date: 2021-09-11 21:11:59
 * @LastEditTime: 2021-09-11 21:20:24
 * @LastEditors: lmh
 * @Description: 将对象转换为相应式
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
    var o = {
        name: 'jim',
        age: 19,
        gender: '男'
    }

    // 简化后版本
    function defineReactive(target, key, value, enumerable) {
        // 函数内部是一个局部作用域， 这个value就只在函数内部使用的变量（闭包）
        Object.defineProperty(target, key, {
            configurable: true,
            enumerable: !!enumerable,
            get () {
                console.log(`读取 o 的 ${key} 属性`)
                return value
            },
            set (newVal) {
                console.log(`设置 o 的 ${key} 属性为：${newVal}`)
                value = newVal
            }
        })
    }

    // 将对象转换为响应式
    let keys = Object.keys(o)
    for (let i = 0; i < keys.length; i++) {
        defineReactive(o, keys[i], o[keys[i]], true)
    }
    </script>
</body>
</html>
